/* Copyright  2009
   @Author
   Richard Changde Yin            e-mail yinchangde@hotmail.com

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; version 2 of the License.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
   
/**
 *@filename: unix_timestamp.cc
 */ 

#include <server_includes.h>
#include CSTDINT_H
#include <function/time/unix_timestamp.h>
#include <field/timestamp.h>
#include <session.h>

#include "temporal.h"

int64_t Item_func_unix_timestamp::val_int()
{
  COLLAPSAR_TIME ltime;

  assert(fixed == 1);
  if (arg_count == 0)
    return (int64_t) current_session->query_start();
  if (args[0]->type() == FIELD_ITEM)
  {                                             // Optimize timestamp field
    Field *field=((Item_field*) args[0])->field;
    if (field->type() == COLLAPSAR_TYPE_TIMESTAMP)
      return ((Field_timestamp*) field)->get_timestamp(&null_value);
  }

  if (get_arg0_date(&ltime, 0))
  {
    /*
      We have to set null_value again because get_arg0_date will also set it
      to true if we have wrong datetime parameter (and we should return 0 in
      this case).
    */
    null_value= args[0]->null_value;
    return 0;
  }

  collapsar::Timestamp temporal;

  temporal.set_years(ltime.year);
  temporal.set_months(ltime.month);
  temporal.set_days(ltime.day);
  temporal.set_hours(ltime.hour);
  temporal.set_minutes(ltime.minute);
  temporal.set_seconds(ltime.second);
  temporal.set_epoch_seconds();

  if (! temporal.is_valid())
  {
    null_value= true;
    char buff[MAX_DATETIME_WIDTH];
    size_t buff_len;
    temporal.to_string(buff, &buff_len);
    buff[buff_len]= '\0';
    my_error(ER_INVALID_UNIX_TIMESTAMP_VALUE, MYF(0), buff);
    return 0;
  }

  time_t tmp;
  temporal.to_time_t(&tmp);

  return (int64_t) tmp;
}
